package com.gitee.dolt.boot.controller;

import com.gitee.dolt.annotation.security.PreAuth;
import com.gitee.dolt.annotation.log.SysLog;
import com.gitee.dolt.core.base.Result;
import com.gitee.dolt.core.base.entity.SuperEntity;
import com.gitee.dolt.core.exception.code.ExceptionCode;
import com.gitee.dolt.core.util.BizAssert;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;


/**
 * 更新
 *
 * @author LYH
 */
public interface UpdateController<Entity, UpdateDTO> extends BaseController<Entity> {

    /**
     * 修改
     *
     * @param dto 修改参数
     * @return
     */
    @ApiOperation(value = "修改", notes = "修改UpdateDTO中不为空的字段")
    @PutMapping
    @SysLog(value = "'修改:' + #dto?.id")
    @PreAuth("hasAnyPermission('{}update')")
    default Result update(@RequestBody @Validated(SuperEntity.Update.class) UpdateDTO dto) {
        Result result = handlerUpdate(dto);
        if (result.isExecDefault()) {
            Entity entity = toBean(dto);
            setNullValue(entity);
            getBaseService().updateById(entity);
            result.setData(entity);
        }
        return result;
    }

    /**
     * 修改所有字段。慎用
     *
     * @param entity 实体
     * @return
     */
    @ApiOperation(value = "修改所有字段", notes = "修改所有字段，没有传递的字段会被置空")
    @PutMapping("/all")
    @SysLog(value = "'修改所有字段:' + #entity?.id")
    @PreAuth("hasAnyPermission('{}update')")
    default Result updateAll(@RequestBody @Validated(SuperEntity.Update.class) Entity entity) {
        if (!enableUpdateAll()) {
            BizAssert.fail(ExceptionCode.NOT_FOUND, "接口未被允许");
        }
        getBaseService().updateAllById(entity);
        return Result.ok(entity);
    }

    /**
     * 自定义编辑
     *
     * @param dto dto
     * @return 返回execDefault=true, 调用默认更新, 返回其他不调用默认更新
     */
    default Result handlerUpdate(UpdateDTO dto) {
        return Result.execDefault(true);
    }

    /**
     * 允许修改所有字段
     *
     * @return
     */
    default boolean enableUpdateAll() {
        return false;
    }

}
